﻿using System.Collections.Generic;
using System.Windows.Forms;
using Business;
using Business.Entity.Estoque.Produto;
using Business.Entity.Vendas.Pedido.ClassesRelacionadas;
using Business.Entity.Vendas.Pedido.Restaurante.ClassesRelacionadas;
using Vendas.Forms;
using Vendas.Properties;

namespace Vendas.Dialogs
{
    public partial class FormComposicao : DevExpress.XtraEditors.XtraForm
    {
        private PedidoControl.ModoPesquisaProduto ModoPesquisa { get; set; }
        [UsedImplicitly]
        private ComposicaoProduto _composicao;
        public ComposicaoProduto Composicao
        {
            get { return _composicao; }
        }

        public FormComposicao(ComposicaoProduto composicao)
        {
            InitializeComponent();
            _composicao = composicao;
            
            produtoBindingSource.DataSource = composicao.Composicao;
            ModoPesquisa = PedidoControl.ModoPesquisaProduto.Descricao;
        }

        private void FormComposicao_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.Control)
            {
                switch (e.KeyData)
                {
                    case Keys.D:
                        ModoPesquisa = PedidoControl.ModoPesquisaProduto.Descricao;
                        filtroLabel.Text = "Descrição:";
                        break;
                    case Keys.B:
                        ModoPesquisa = PedidoControl.ModoPesquisaProduto.CodBarras;
                        filtroLabel.Text = "Cód. barra:";
                        break;
                    case Keys.R:
                        ModoPesquisa = PedidoControl.ModoPesquisaProduto.Referencia;
                        filtroLabel.Text = "Referência:";
                        break;
                }
            }

            if (e.KeyData == Keys.Escape)
            {
                Close();
            }
        }

        private void FormComposicao_FormClosing(object sender, FormClosingEventArgs e)
        {
            decimal precoVenda = 0;
            if (Utils.Configuracao.CobrarComposicaoPorMaiorValor)
            {

                foreach (ProdutoPedido produto in produtoBindingSource)
                {
                    if (precoVenda < produto.Produto.PrecoVenda)
                    {
                        precoVenda = produto.Produto.PrecoVenda;
                        Composicao.Produto = produto.Produto;
                    }
                }
            }
            else
            {
                foreach (ProdutoPedido produto in produtoBindingSource)
                {
                    precoVenda += produto.Produto.PrecoVenda;
                }
                precoVenda = precoVenda / produtoBindingSource.Count;
            }
            Composicao.ValorUnitario = precoVenda;
            Composicao.Valor = precoVenda * Composicao.Quantidade;
        }

        private void txtFiltro_KeyDown(object sender, KeyEventArgs e)
        {
            if (!txtFiltro.Text.Equals("") &&
                (produtoBindingSource.Count < Utils.Configuracao.LimitarComposicaoDeProdutoEm ||
                Utils.Configuracao.LimitarComposicaoDeProdutoEm == 0))
            {
                Produto prod = null;
                switch (ModoPesquisa)
                {
                    case PedidoControl.ModoPesquisaProduto.CodBarras:
                        prod = Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetProducaoPropriaByCodBarra(txtFiltro.Text));
                        break;
                    case PedidoControl.ModoPesquisaProduto.Descricao:
                        prod = Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetProducaoPropriaByDescricao(txtFiltro.Text));
                        break;
                    case PedidoControl.ModoPesquisaProduto.Referencia:
                        prod = Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetProducaoPropriaByReferencia(txtFiltro.Text));
                        break;
                }
                if (prod != null)
                {
                    produtoBindingSource.Add(ProdutoPedidoRepository.CreateProdutoPedido(
                        prod,1));
                    txtFiltro.Text = "";
                }
            }
        }
    }
}